/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CiaAerea;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author mbm
 */
public class Cliente extends Pessoa implements Serializable {

    private boolean isClienteFidelidade;
    private String numeroFidelidade;
    
    private Hashtable<Integer, Reserva> HreservaCliente = new Hashtable<Integer, Reserva>();

    public Cliente() throws Exception {
        super();

        setIsClienteFidelidade(false);
        setNumeroFidelidade("");
    }

    public Cliente(String nome, String cpf, String eMail, String telefone, String celular, 
            boolean isClienteFidelidade, String numeroFidelidade,Endereco end ) throws Exception {
        //Chamando construtor da classe pai
        super(nome,cpf,eMail,telefone,celular,end);
        
        setIsClienteFidelidade(isClienteFidelidade);
        setNumeroFidelidade(numeroFidelidade);
    }

    public Reserva getReservaCliente(int codReserva) {
        return HreservaCliente.get(codReserva);
    }

    public Enumeration<Integer> getallReservaCliente() {
        
        return HreservaCliente.keys();
    }

    public void setReservaCliente(Reserva reservaCliente) {
        
        this.HreservaCliente.put(reservaCliente.getCodReserva(), reservaCliente);
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public boolean getIsClienteFidelidade() {
        return isClienteFidelidade;
    }

    public void setIsClienteFidelidade(boolean isClienteFidelidade) {

        if (isClienteFidelidade != true && isClienteFidelidade != false) {
            System.out.println("Campo verificacao de fidelidade incorreto!");
        } else {
            this.isClienteFidelidade = isClienteFidelidade;
        }

    }

    public String getNumeroFidelidade() {
        return numeroFidelidade;
    }

    public void setNumeroFidelidade(String numeroFidelidade) {

        if (numeroFidelidade == null) {
            System.out.println("Campo Numero Fidelidade em branco!");
        } else {
            this.numeroFidelidade = numeroFidelidade;
        }

    }

    public void removeReservaCliente(int codigoVoo) {
        
        //Removendo do Hashtable
        HreservaCliente.remove(codigoVoo);
    }
    
    public void escrever(Cliente dados) throws Exception
    {
        try
        {
            File arquivo = new File("cliente_"+cpf+".ser");
            if(arquivo.exists()){
                throw new Exception("Cliente já existente!");
            }
            else{
            ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("cliente_"+cpf+".ser"));
            saida.writeObject(dados);
            }
            
        }catch(IOException ioException)
        {
            System.err.println(ioException.getMessage());
        }
    }
    
    public Cliente ler(String cpf) throws Exception
    {
        Cliente dados = new Cliente();
        try
        {
            ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("cliente_"+cpf+".ser"));
             
            dados = (Cliente) entrada.readObject(); 
            
            
            
            
        }catch(IOException ioException)
        {
            System.err.println(ioException.getMessage());
       
         } catch (ClassNotFoundException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
           return dados; 
        }
    
    }
    
    public void remover(String cpf)
    {
        try
        {
           
           File file = new File("cliente_"+cpf+".ser");
           
           if(file.delete())
           {
               JOptionPane.showMessageDialog(null, "Arquivo deletado com sucesso!");
           }
           else
           {
               JOptionPane.showMessageDialog(null, "Problemas ao deletar o arquivo.");
           }
           
            
            
        }catch(Exception e)
        {
            System.err.println(e.getMessage());
        }
    }
    
    public void alterar(Cliente dados) throws Exception{
        
        try{
        ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("cliente_"+dados.getCpf()+".ser"));
        saida.writeObject(dados);
        }catch(Exception e){
            throw new Exception("Erro ao Alterar!");
        }
            
        
    }
}
